package com.loong.musicdemo.util.dataDeal;

import android.util.Pair;

import com.loong.musicdemo.util.HostUtil;
import com.loong.musicdemo.util.httpUtil.HttpUtil;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 歌词处理类
 */
public class LrcDeal {
    private static final String HOST = HostUtil.getHost();//主机

    /**
     * 通过歌曲ID获取歌词字符串
     *
     * @param id 歌曲id
     * @return lrc 歌词
     */
    public static String getLrcBySongId(String id) {
        String url = HOST + "/lyric?id=" + id;
        String lrc = "暂无歌词~";
        String request = HttpUtil.sendReturnOKHttpRequest(url);
        try {
            if (request != null) {
                JSONObject object = new JSONObject(request).optJSONObject("lrc");
                if (object != null) {
                    lrc = object.optString("lyric");
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return lrc;
    }

    /**
     * 返回格式化的标题数据
     *
     * @param lrcString 歌词字符串
     * @return 格式化后歌词列表
     */
    public static List<Pair<Long, String>> parseLrcString(String lrcString) {

        //lrcString = "[by:mwstty]\n[ti:一路好走]\n[ar:房祖名]\n[al:一路好走]\n[00:03.49]\n[00:14.42]向前走 别回头\n[00:19.58]留着痛你说想走\n[00:24.75]小时候你牵着我的手\n[00:29.47]拍拍我的头说有我已足够\n[00:33.03]\n[00:33.88]一路  好走\n[00:39.41]我会记得你的所有\n[00:41.78]记得曾经拥有\n[00:44.33]一路  好走\n[00:49.69]想着天空飞去别回头\n[00:56.57][01:05.70]\n[01:06.66]向前走 别回头\n[01:11.43]留着痛你说想走\n[01:16.60]小时候你牵着我的手\n[01:21.38]拍拍我的头说有我已足够\n[01:25.28]\n[01:26.16]一路  好走\n[01:31.37]我会不时对你想念\n[01:34.34]珍惜身边所有\n[01:36.48]一路  好走\n[01:41.94]我会想念小时候与你手牵手\n[01:46.03]\n[01:46.97]无言  泪流\n[01:52.16]握紧你的手和你走到最后\n[01:57.30]一路  好走\n[02:02.64]想着天空飞去别回头\n[02:10.99]\n[02:11.77]无欲无累 无好无坏\n[02:16.92]无病无痛 不空不满\n[02:22.07]无对无错 无少无多\n[02:27.45]无生无死 不黑不白\n[02:30.26]\n[02:31.02]爱我  别走\n[02:36.69]这样自私的话我说不出口\n[02:41.69]心痛  泪流\n[02:46.97]看着你微弱的呼吸到最后\n[02:51.29]\n[02:52.19]最后  请慢走\n[02:57.37]想说一生曾拥有你我也足够\n[03:02.50]百年  之后\n[03:07.85]我们约定在天上再聚头\n[03:15.00]\n[03:15.89]一路  好走\n[03:21.08]替我带给他们一句温暖的问候\n[03:26.58]百年  之后\n[03:32.07]我们约定在天上\n[03:35.15]再聚头\n[03:38.46]\n";
        //存储所有歌词信息的容器
        List<Pair<Long, String>> list = new ArrayList<>();
        String[] lrcp = lrcString.split("\\r?\\n");//解析后成行的歌词
        String regex = "\\[(\\d{1,2}):(\\d{1,2}).(\\d{1,3})]"; // 正则表达式
        Pattern pattern = Pattern.compile(regex);//创建pattern对象
        for (String line : lrcp) {
            Matcher matcher = pattern.matcher(line);
            while (matcher.find()) {
                //用于存储当前时间和文字信息的容器
                String min = matcher.group(1);//分钟
                String sec = matcher.group(2);//秒
                String mill = matcher.group(3);//毫秒/10
                long time = getLongTime(min, sec, mill + "0");//获取格式化后时间
                String text = line.substring(matcher.end());
                Pair<Long, String> map = new Pair<>(time, text);
                list.add(map);
            }
        }
        return list;
    }

    /**
     * 时间处理
     *
     * @param min  分
     * @param sec  秒
     * @param mill 毫秒
     * @return 标准时间格式
     */
    private static long getLongTime(String min, String sec, String mill) {
        // 转成整型
        int m = Integer.parseInt(min);
        int s = Integer.parseInt(sec);
        int ms = Integer.parseInt(mill);

        if (s >= 60) {
            s = 59;//默认时间为59秒最多
        }
        // 组合成一个长整型表示的以毫秒为单位的时间
        return m * 60 * 1000 + s * 1000 + ms;
    }

}
